home *** CD-ROM | disk | FTP | other *** search
/ Programming Languages Suite / ProgramD2.iso / Borland / Borland C++ V5.02 / APPLAUNC.PAK / APPBTNBA.CPP < prev    next >
C/C++ Source or Header  |  1997-05-06  |  5KB  |  210 lines

  1. //----------------------------------------------------------------------------
  2. // ObjectWindows
  3. // Copyright (c) 1993, 1995 by Borland International, All Rights Reserved
  4. //----------------------------------------------------------------------------
  5. #include <owl/pch.h>
  6. #include <owl/applicat.h>
  7. #include <math.h>
  8. #include "appbtnba.h"
  9. #include "applaunc.rh"
  10.  
  11. DEFINE_RESPONSE_TABLE1(TAppButtonBar, TToolBox)
  12.   EV_WM_RBUTTONDOWN,
  13.   EV_WM_LBUTTONUP,
  14.   EV_WM_LBUTTONDOWN,
  15.   EV_WM_MOUSEMOVE,
  16. END_RESPONSE_TABLE;
  17.  
  18. const int TAppButtonBar::AppButtonIdBase = 500;
  19.  
  20. //
  21. //
  22. //
  23. void
  24. TAppButtonBar::SetupWindow()
  25. {
  26.   TToolBox::SetupWindow();
  27.   DragState = 0;
  28.   OrigCursor = 0;
  29.   DragCursor = ::LoadCursor(GetModule()->GetInstance(),
  30.                             MAKEINTRESOURCE(IDC_DRAG_BUTTON));
  31.   CM_PROPERTIES = ::RegisterWindowMessage("CM_PROPERTIES");
  32.   CM_BUTTON_PRESSED = ::RegisterWindowMessage("CM_BUTTON_PRESSED");
  33.   CM_BUTTON_DRAG = ::RegisterWindowMessage("CM_BUTTON_DRAG");
  34.  
  35. }
  36.  
  37. //
  38. // MoveButton(). Move a button, specified by 'srcLoc', to another location,
  39. // specified by 'destLoc'.  The button to be 'moved' is removed from the
  40. // button bar and then a new one (with same characteristics) is re-inserted into
  41. // the proper place.  Assumes that all the buttons will be re-ided after call.
  42. //
  43. void
  44. TAppButtonBar::MoveButton(int srcLoc, int destLoc, const string& iconPath )
  45. {
  46.   TAppButton* toMove = ButtonWithId(IdFromLoc(srcLoc));
  47.   TAppButton* toInsertBefore = ButtonWithId(IdFromLoc(destLoc));
  48.   TAppButton* newButton = new TAppButton(GetApplication()->GetInstance(),
  49.                                          iconPath, IdFromLoc(srcLoc));
  50.  
  51.   if (toInsertBefore)
  52.     Insert(*newButton, Before, toInsertBefore);
  53.   else
  54.     Insert(*newButton, Before, GadgetWithId(IDB_APPREMOVER));
  55.   delete Remove(*toMove);
  56. }
  57.  
  58. //
  59. // ChangeOrientation(). Change layout of application buttons (vertical or
  60. // horizontal).
  61. //
  62. void
  63. TAppButtonBar::ChangeOrientation(TTileDirection direction)
  64. {
  65.   SetDirection(direction);
  66. }
  67.  
  68. //
  69. // DestroyButton(). Delete a button given by location.
  70. //
  71. void
  72. TAppButtonBar::DestroyButton(int loc)
  73. {
  74.   TAppButton* b = ButtonWithId(IdFromLoc(loc));
  75.   Remove(*b);
  76.   delete b;
  77. }
  78.  
  79. //
  80. // Return button with given 'real' id.
  81. //
  82. TAppButton*
  83. TAppButtonBar::ButtonWithId(int id)
  84. {
  85.   TAppButton* b = TYPESAFE_DOWNCAST(FirstGadget(), TAppButton);
  86.   while (b) {
  87.     if (b->RealId == id)
  88.       return b;
  89.     else
  90.       b = TYPESAFE_DOWNCAST(NextGadget(*b), TAppButton);
  91.   }
  92.   return 0;
  93. }
  94.  
  95. //
  96. // Flush().  Remove all buttons from button bar.
  97. //
  98. void
  99. TAppButtonBar::Flush(int del)
  100. {
  101.   TGadget* g = FirstGadget();
  102.   while (g) {
  103.     Remove(*g);
  104.     if (del)
  105.       delete g;
  106.     g = FirstGadget();
  107.   }
  108. }
  109.  
  110. //
  111. // EvRButtonDown(). Send message (CM_PROPERTIES) to main window so
  112. // properties dialog can be displayed for this button.
  113. //
  114. void
  115. TAppButtonBar::EvRButtonDown(UINT /*modKeys*/, TPoint& point)
  116. {
  117.   TAppButton* temp;
  118.   if ((temp = TYPESAFE_DOWNCAST(GadgetFromPoint(point), TAppButton)) != 0)
  119.     Parent->PostMessage(CM_PROPERTIES, temp->RealId, 0);
  120. }
  121.  
  122. //
  123. // EvLButtonUp(). If a drag was in program send a message, CM_BUTTON_DRAG,
  124. // to main window.  If button was simple pressed send message,
  125. // CM_BUTTON_PRESSED, to main window so selected app can be run.
  126. //
  127. void
  128. TAppButtonBar::EvLButtonUp(UINT modKeys, TPoint& point)
  129. {
  130.   TAppButton* temp = TYPESAFE_DOWNCAST(GadgetFromPoint(point), TAppButton);
  131.  
  132.   if (DragState == 2) {
  133.     TPoint  screenPoint(point);
  134.  
  135.     ClientToScreen(screenPoint);
  136.     ResetOrigCursor();
  137.     if ((temp && temp->RealId != DragButtonId) || !temp &&
  138.         Parent->GetWindowRect().Contains(screenPoint))
  139.       Parent->PostMessage(CM_BUTTON_DRAG, DragButtonId,
  140.                           MAKELPARAM(point.x, point.y));
  141.   } else {
  142.     if (temp != 0)
  143.       Parent->PostMessage(CM_BUTTON_PRESSED, temp->RealId, LPARAM(HWindow));
  144.   }
  145.   DragState = 0;
  146.   TToolBox::EvLButtonUp(modKeys, point);
  147. }
  148.  
  149. //
  150. // EvLButtonDown(). Indicate that a possible button drag is in progress.
  151. //
  152. void
  153. TAppButtonBar::EvLButtonDown(UINT modKeys, TPoint& point)
  154. {
  155.   TAppButton* temp = TYPESAFE_DOWNCAST(GadgetFromPoint(point), TAppButton);
  156.   if (temp && temp->GetId() != IDB_APPREMOVER) {
  157.     DragButtonId = temp->RealId;
  158.     DragState = 1;
  159.     StartDragPoint = point;
  160.   }
  161.   TToolBox::EvLButtonDown(modKeys, point);
  162. }
  163.  
  164. //
  165. // EvMouseMove().  If dragging, set the cursor.  A check is made
  166. // to see if we have moved far enough to regard the mouse move as a drag.
  167. //
  168. void
  169. TAppButtonBar::EvMouseMove(UINT modKeys, TPoint& point)
  170. {
  171.   if (DragState == 1 && (abs(point.x - StartDragPoint.x) > 5 ||
  172.                          abs(point.y - StartDragPoint.y) > 5)) {
  173.     DragState = 2;
  174.     SetDragCursor();
  175.   }
  176.   TToolBox::EvMouseMove(modKeys, point);
  177. }
  178.  
  179. //
  180. // ReDraw(). Begin a layout session. Then move window so everthing gets
  181. // drawn again.
  182. //
  183. void
  184. TAppButtonBar::ReDraw()
  185. {
  186.   LayoutSession();
  187. }
  188.  
  189. //
  190. // SetDragCursor().  Change cursor to button drag cursor.
  191. //
  192. void
  193. TAppButtonBar::SetDragCursor()
  194. {
  195.   if (!OrigCursor)
  196.     OrigCursor = ::GetCursor();
  197.   ::SetCursor(DragCursor);
  198. }
  199.  
  200. //
  201. // ResetOrigCursor().  Change cursor back to whatever is was before.
  202. //
  203. void
  204. TAppButtonBar::ResetOrigCursor()
  205. {
  206.   if (OrigCursor)
  207.     ::SetCursor(OrigCursor);
  208.   OrigCursor = 0;
  209. }
  210.